Skip to main content

Python Magic Method

Table of Contents

魔术方法

魔术方法是 Python 对象中特殊方法, 方法开头和结尾, 例如 __init__
python 对象的大多数操作都是通过魔术方法定义的
魔术方法大都由对应的标准函数触发

new and init

__new__ : 在对象实例化前时候调用, 可自定义返回值
__init__: 在对象创建之后调用, 用来初始化对象属性, 返回值必须是 None

class Person:

def __new__(self, *args, **kwargs):
print('before create object')
return object.__new__(self)

def __init__(self, name):
print(f'after create object, init object {name}')

Person('petter')
before create object
after create object, init object petter


class Person:

def __new__(self, *args, **kwargs):
print('before create object')
return object.__new__(self)

def __init__(self, name):
print(f'after create object, init object {name}')

Person('petter')
before create object

注意: 若 __new__ 未返回一个实例化对象,则 __init__ 不执行

class Person:

def __new__(cls, name, age):
print('class init')
cls.name, cls.age = name, age
return cls

p = Person(name='lily', age=16)
print(f'class {Person.name} {Person.age}')
print(f'class {p.name} {p.age}')

class init
class lily 16
class lily 16

通过魔术方法 new, 使类初始化达到对象初始化的效果

repr str

__repr__ : 返回对象的可打印字符串, 用于调试
__str__ : 返回对象的可打印字符串, 用于用户

class Person:

def __repr__(self):
return "repr content"

def __str__(self):
return "str content"

p = Person()
print(p) # str content
print(repr(p)) # repr content

print / str / repr 调用顺序 repr => Person.repr() > object.repr() print / str => Person.str() > Person.repr() > object.repr()

file function name

__file__ : 返回当前模块所在的文件绝对路径
__function__ : 返回当前函数的名称 __name__ : 返回当前模块的名称(若文件为 python 入口文件, 则为 main)

# package.py 写入代码
print(f"package.py {__file__} {__name__}")
name = "John"

# run.py 写入代码
if __name__ == '__main__':
print(f"run.py {__file__} {__name__}")

from package import name
print(f"import {name = }")

# python run.py 执行 run.py
run.py E:\文档\Python\run.py __main__
package.py E:\文档\Python\package.py package
import name = 'John'

iter next

__iter__ : 返回一个迭代器对象, 用于迭代对象
__next__ : 返回迭代器对象的下一个值, 用于迭代对象

getitem setitem

__getitem__ : 返回对象的某个元素
__setitem__ : 设置对象的某个元素

enter exit